/*
 * @Author: your name
 * @Date: 2021-09-10 19:06:55
 * @LastEditTime: 2021-09-16 09:13:23
 * @LastEditors: Please set LastEditors
 * @Description: 请求拦截
 * @FilePath: \kdy-uni-cil\src\common\http.interceptor.js
 */
let is_login = true
import env from '@/config'
// 这里的Vue为Vue对象(非创建出来的实例)，vm为main.js中“Vue.use(httpInterceptor, app)”这一句的第二个参数，
// 为一个Vue的实例，也即每个页面的"this"
// 如果需要了解这个install方法是什么，请移步：https://uviewui.com/components/vueUse.html
const install = (Vue, vm) => {
    // 此为自定义配置参数，具体参数见上方说明
    Vue.prototype.$u.http.setConfig({
        baseUrl: env.apiUrl,
        loadingText: '努力加载中~',
        // 设置为json，返回后会对数据进行一次JSON.parse()
        dataType: 'json',
        showLoading: true, // 是否显示请求中的loading
        loadingTime: 800,
        loadingMask: true, // 展示loading的时候，是否给一个透明的蒙层，防止触摸穿透
        originalData: false, // 是否在拦截器中返回服务端的原始数据
    })

    // 请求拦截部分，如配置，每次请求前都会执行
    Vue.prototype.$u.http.interceptor.request = (config) => {
        let token = ''
        if (vm.$store.state.vuex_token) {
            token = vm.$store.state.vuex_token
                // 自动添加请求头
            config.header.Authorization = "Bearer " + token
        }

        config.header.ClientType = env.appName
            //#ifdef  APP-PLUS
        config.header.Client = "APP-PLUS"
            //#endif
            //#ifdef  H5
        config.header.Client = "H5"
            //#endif
            //#ifdef  MP-WEIXIN
        config.header.Client = "MP-WEIXIN"
            //#endif
            // 最后需要将config进行return
        return config

    }


    // 响应拦截，如配置，每次请求结束都会执行本方法
    Vue.prototype.$u.http.interceptor.response = (res) => {
        // 判断响应的数据含有statusCode字段 && 请求没有成功
        if (res.hasOwnProperty("statusCode") && res.statusCode >= 300) {
            if (res.statusCode == 401 && is_login) {
                is_login = false
                vm.$u.toast('登录超时，请重新登录')
                setTimeout(() => {
                    vm.$u.vuex("vuex_user", {});
                    vm.$u.vuex("vuex_token", "");
                    // 此为uView的方法，详见路由相关文档
                    // vm.$u.route('pages/public/main')
                    vm.$u.route('pages/public/login')
                    is_login = true
                }, 1500)
                return false;
            }
            // 服务器响应报错  比如字段没有填写
            if (res.statusCode == 422) {
                res.data.errors.forEach((item, index) => {
                    setTimeout(() => {
                        vm.$u.toast(item.code)
                    }, index * 1500)
                })
                return false;
            }
            vm.$u.toast(res.data.message)
                // 并将进入this.$u.post(url).then().catch(res=>{})的catch回调中，res为服务端的返回值
            return false;
        }

        return res.data
    }

}

export default {
    install
}